package com.zhoukx.netty.codec2;

import com.zhoukx.netty.codec.StudentPOJO;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.CharsetUtil;

/**
 *  说明
 *   我们自定义一个handler 需要继续netty 规定好的某个HandlerAdaoter
 *   这是我们自定义一个Handler,才能称为Handler
 */
public class NettyServerHandler extends SimpleChannelInboundHandler<MyDataInfo.MyMessage> {
    /**
     *    读取数据实际(这里我们可以读取客户端发送的消息)
     *
     * 1. ChannelHandlerContext 上下文对象,含通道pipepline,通道channel地址
     * 2. Object msg:就是客户端发送的数据 默认是Object
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    public void channelRead0(ChannelHandlerContext ctx, MyDataInfo.MyMessage msg) throws Exception {
        // 根据dataType显示不同的信息
        MyDataInfo.MyMessage.DataType dataType = msg.getDataType();
        if (dataType == MyDataInfo.MyMessage.DataType.WorkerType) {
            System.out.println("客户端发送的数据 age="+ msg.getWorker().getAge()+" 名字+"+msg.getWorker().getName());
        } else  if(dataType == MyDataInfo.MyMessage.DataType.StudentType){
            System.out.println("客户端发送的数据 id="+ msg.getStudent().getId()+" 名字+"+msg.getStudent().getName());

        }else{
            System.out.println("传输的类型不正确");
        }

    }

    /**
     *  数据读取完毕
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        // 将数据写入到缓存,并刷新
        // 一般来讲,我们队发送的数据进行编码
        ctx.writeAndFlush(Unpooled.copiedBuffer(" Hello,客户端~",CharsetUtil.UTF_8));
    }

    /**
     *  发生异常处理
     * @param ctx
     * @param cause
     * @throws Exception
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
       ctx.close();
    }
}
